type MessageType = "image" | "audio" | string; // 微信消息类型
// type xtype = string;

let obj = { username: "wangwu", age: 123 };

type Message = {
  id: number;
  type: MessageType;
  sendmessage: string;
};

let msgobj: Message = {
  id: 23,
  type: "文本",
  sendmessage: "优化了多级联动的纯文本模式下内容显示错误的问题；",
};

// 对象数据类型
// let messages: Array<Message> = [
let messages: Message[] = [
  { id: 1, type: "image", sendmessage: "你好啊，今晚咋们一起去三里屯吧" },
  { id: 2, type: "audio", sendmessage: "你好！张无忌" },
  { id: 3, type: "audio", sendmessage: "朝辞白帝彩云间，千里江陵一日还" },
  { id: 4, type: "image", sendmessage: "刘老根苦练舞台绝技" },
  { id: 5, type: "image", sendmessage: "今晚王牌对王牌节目咋样" },
];

// 不用函数重载来实现
function getMessage(
  value: number | MessageType
): Message | undefined | Array<Message> {
  // 使用了联合类型来约束我们当前这个方法一个参数
  if (typeof value === "number") {
    return messages.find((msg: Message) => {
      return value === msg.id;
    });
  } else {
    return messages.filter((msg) => {
      return value === msg.type;
    });
  }
}
console.log(getMessage(1));
console.log(getMessage("audio"));

// TS没有办法在运行之前根据传递的值来推导方法最终返回的数据的数据类型
// 只可以根据方法定义的类型展现
// let msg = getMessage(1);
// console.log(msg.sendmessage); // 类型“Message | Message[]”上不存在属性“sendmessage”。
//类型“Message[]”上不存在属性“sendmessage”。
// msg调用不到sendmessage主要就是在联合类型中找不到。

// 对于上面的解决方法
let msg = <Message>getMessage(1); // 类型转换，我把你的这个类型变成一个Message
console.log(msg.sendmessage);

export {};
